from django import http
from django.shortcuts import render


# Create your views here.
from django.views import View
# from .constant import YUNTONGXUN_EXPIRE_TIME, SMS_CODE_EXPIRE_TIME, YUNTONGXUN_MODEL_1
from redis import StrictRedis

from apps.verifications.constant import YUNTONGXUN_EXPIRE_TIME, SMS_CODE_EXPIRE_TIME, YUNTONGXUN_MODEL_1
from libs.yuntongxun.sms import CCP
from utils.response_code import RETCODE

import logging
logger = logging.getLogger('django')

class ImageCodeView(View):
    # 当用户输入完成手机号，图片验证码之后，点击获取短信验证码的时候，需要让前段提供手机号
    # 图片验证uuid，用户输入的图片验证码内容


    def get(self,request,uuid):
        from libs.captcha.captcha import captcha
        text,image = captcha.generate_captcha()

        from django_redis import get_redis_connection
        redis_conn = get_redis_connection('code')

        # setex(主键，过期时间，value)
        redis_conn.setex('img_%s'%uuid,120,text)

        # content_type用法  大类/小类 可百度MIME

        return http.HttpResponse(image,content_type='image/jpeg')

class SMSCodeView(View):
    def get(self, request, mobile):

        # 1.后端要接受数据
        params = request.GET
        uuid = params.get('image_code_id')  #验证码的uuid
        text_client = params.get('image_code')  #用户输入验证吗的内容

        from django_redis import get_redis_connection
        # 当我们去操作外界资源的时候【mysql,Redis,读取文件]
        # 我们不能确定外界资源会发生说明
        # 所以我们需要对外界资源的代码进行异常捕获i
        # 这样可以保证代码的健壮行
        try:
            redis_conn =get_redis_connection('code')
            text_server = redis_conn.get('img_%s' %uuid)

            # 2.验证数据
            if text_server is None:
                return http.HttpResponseBadRequest('验证码已过期')
            #redis获取的数据都是二进制，所以需要decode，lower把所有字母识别成小写
            if text_server.decode().lower() != text_client.lower():
                return http.HttpResponseBadRequest('验证码错误，请重新输入')
            #删除redis中的已经获取的图片验证码
            redis_conn.delete ('img_%s' %uuid)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseBadRequest('数据库连接问题 ')
        # 避免频繁发送短信
        # 先获取是否有标记位，
        send_flag=redis_conn.get('send_flag%s' %mobile)
        if send_flag is not None:
            return http.HttpResponseBadRequest('操作频繁')


        # 生成短信验证码
        from random import randint
        sms_code = '%06d'%randint(0,999999)
        logger.info(sms_code)


        # # 保存短信验证码
        # redis_conn.setex('sms_%s'%mobile,SMS_CODE_EXPIRE_TIME,sms_code)
        # #生成一个标记位 标记位为1表示已发送
        # redis_conn.setex('send_flag_%s'%mobile,60,1)
        #
        # 通过redis的连接 创建管道实力
        pl=redis_conn.pipeline()
        # 将redis指令 缓存到管道中
        pl.setex('sms_%s' %mobile,SMS_CODE_EXPIRE_TIME,sms_code)

        pl.setex('send_flag_%s' % mobile, 60, 1)

        # 通过execute执行管道
        pl.execute()


        # 发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code,YUNTONGXUN_EXPIRE_TIME],YUNTONGXUN_MODEL_1)
        # 返回响应

        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)

        return http.JsonResponse({'code':RETCODE.OK})




